04. 确定你的任务

你的任务

假设你正在使用某个第三方库构建一个项目。如果在使用此第三方库时遇到 bug 或拼写错误,该怎么办?虽然你有能力修复它,但你没有直接访问原库进行修改的权限。不过这不是问题,因为你知道 fork 其他开发者的仓库可以将其复制到你的帐户,使你可以全权对它执行 git pull git push

但是,当你获得了其他开发者项目的副本,并拥有完全访问权限后,你应该做什么?我们将在下节课学习这一部分,但是如果你 fork 了一个项目,并且你的 fork 中包含原项目所没有的代码,则可以通过向原项目的维护者发送一个请求,将你的代码更改包含在其中,请求维护者将这些更改拉取到原项目中。这种请求称为“拉取请求”(Pull Request)。再次说明,我们将在下一课中介绍发送和使用“Pull Request”。所以,现在你知道如何将你的代码加入到原项目中的方法,并且你想帮助解决这个拼写/代码错误。那么你有任务在身啦!但是,你如何以原项目维护者能接受的方式实际对项目做出贡献,并使他最终合并你的更改?记住,你要做的第一件事,是在项目中寻找一个名为 CONTRIBUTING.md 的文件。

CONTRIBUTING.md 文件

CONTRIBUTING.md 文件的名称特别采用全大写,以方便查找。你可能会从它的名称猜到文件的用途,此文件列出了你要为项目做出贡献时所应遵循的信息。在开始任何开发工作之前,应先找到此文件。
我们来看看 Lighthouse 项目的 CONTRIBUTING 文件:

_Google 的 Lighthouse 项目的 CONTRIBUTING.md 文件。_

Google 的 Lighthouse 项目的 CONTRIBUTING.md 文件。

你可以看到文件的顶行说:

欢迎你提供帮助!本文档介绍了如何成为贡献者并向项目提交代码。

本文件有两个主要部分:

  • "For Contributors" 面向贡献者的部分
  • "For Maintainers" 面向维护者的部分

每部分都有各自的小节,指导读者如何加入此项目和做出贡献。

我们来看看签署贡献者许可证的小节。以下是在制作此课程时此小节的显示内容:

_Google 的 Lighthouse 项目中 CONTRIBUTING.md 文件的“贡献者许可协议”(Contributor License Agreement)部分。_

Google 的 Lighthouse 项目中 CONTRIBUTING.md 文件的“贡献者许可协议”(Contributor License Agreement)部分。

可以看到,要为此项目做出贡献,你需要签署 Google 的“贡献者许可协议”。

QUESTION:

查看 Lighthouse 项目的 CONTRIBUTING 文件 。哪个文件包含有关 Lighthouse 项目的代码样式的信息?

SOLUTION:

NOTE: The solutions are expressed in RegEx pattern. Udacity uses these patterns to check the given answer

可以看到,此贡献者文件中包含大量信息。所以当你想对一个项目做出贡献时,一定要查阅 CONTRIBUTING.md 文件。

GitHub Issues

如果你的代码更改只是修改简单的拼写错误,那么你可以直接进行更改。但如果你要做涉及大量文件的重大修改,则你可能要在开始之前,先获得项目维护者的批准。你肯定不想花几个小时更改项目,最后却发现别人正在做同样的事情。到头来,花费了大量时间和精力做了重复工作。在 CONTRIBUTING.md 文件中,它解释了应该 如何 规范书写代码,以及你做出贡献的方式,但你如何知道应该贡献 什么 呢?你应该直接与项目维护人员交谈。GitHub 有一个非常赞的页面,使你能以公开的方式向项目维护者提问,让每个人都能看到项目的动态。

这是 GitHub 的 Issues 界面:

_Lighthouse 项目的 Issues 页面。_

Lighthouse 项目的 Issues 页面。

注意,这里说的"Issues(问题)"并不代表实际存在错误,它可以是需要对项目进行的任何改变。GitHub 的问题跟踪器相当高级。每个问题都可以:

  • 应用一个或多个标签
  • 被分配给个人
  • 确定一个里程碑(例如问题将由下一个主要版本解决)

但问题跟踪器最重要的一个方面在于,每个问题都可以有自己的评论区,使开发者围绕这个问题展开对话。

查看这个有很多评论的 问题

_关于此 Issue 的前几个评论在讨论解决 Chrome 兼容性和 Lighthouse 扩展的方法。_

关于此 Issue 的前几个评论在讨论解决 Chrome 兼容性和 Lighthouse 扩展的方法。

Issue 的另一个很棒的功能在于:

  • 你可以订阅某个 Issue ,这样你便会获得新评论和代码更改的通知
  • 你可以就具体变更与项目维护者持续交流

在向某个文件贡献任何内容之前,请查看 CONTRIBUTING.md 中的说明。然后查看项目的 Issue,看是否有哪些与你要贡献的内容类似。如果有,则订阅该 Issue 并阅读现有的对话,看你是否可以提供帮助。如果你查看了 Issues 列表,没有看到与你要做的事情类似的内容,那么你可以创建自己的新 Issue。在 GitHub 问题界面的每个页面上,都能找到“New Issue(新建问题)”按钮:

_Lighthouse 项目问题页面上的 New Issue(新建问题)按钮。_

Lighthouse 项目问题页面上的 New Issue(新建问题)按钮。

点击该按钮可以创建新问题

_Lighthouse 项目的 New Issue 页。表格上方显示了要求参阅贡献准则的提醒。_

Lighthouse 项目的 New Issue 页。表格上方显示了要求参阅贡献准则的提醒。

New Issue 页

新建问题页好的一点在于,如果项目有 CONTRIBUTING.md 文件,它会在页面顶部显示一个提醒,要求你查看有关如何为项目做贡献的准则。点击"guidelines for contributing"链接,可以转至 CONTRIBUTING.md 文件。

GitHub 问题页面支持 Markdown,所以当你创建了自己的问题后,可以使用 Markdown 编排格式,并通过包含链接、图像、项目符号列表和代码块按照你想要的方式进行编写。

💡 学习 Markdown! 💡

从 README 文件,到新建问题页面及评论,Markdown 都极其重要!如果你不熟悉 Markdown,请查看我们的[编写 README] 课程 ( https://www.udacity.com/course/writing-readmes--ud777),我们将会讲解关于 Markdown 的所有知识。该课程十分简短,有什么理由不花上一小时时间学习这项强大的技能!

与编写描述性的提交说明一样,你在创建问题时,要给它一个信息丰富的标题,简要说明你想要做的事情。然后,在评论部分,提供大量关于此更改的详细信息,可以是你为什么认为此更改有必要,也可以是它如何改进项目。

通常情况下,项目的维护者都有全职工作,只在闲暇时间研究项目,因此,在你急着进行修改前,请给他们一些时间来回答你的问题。一旦项目维护者给予批准,你便可以开始应用想要贡献给项目的更改了。

特性分支

组织你想贡献给项目的一系列 commit 或更改的最佳方法,是 将它们全部放在一个特性分支上 。我说的 特性分支 是什么意思呢?与主分支不同,主分支是保存整个项目的所有 commit 的默认分支,而特性分支仅保存单个概念或单个更改区域的 commit 。

例如,如果登录某个网站的登录表单有问题,则解决此特定问题的分支名称可以叫做:

  • login
  • login-bug
  • signup-bug
  • login-form-bug
  • 等等。

有很多名称可以用作特性分支的名称。你只需为分支提供一个清晰的描述性名称,以便在列出所有分支时,你可以立即根据名称确定要在分支中做哪些更改。

Lighthouse 项目的一个分支名称为 add-a11y-tests 。你认为这是一个用于特性分支的好名字吗? (提示 - a11y 代表"accessibility"。在"accessibility" 中, a y 之间有十一个字母,所以缩写为了 a11y !)

SOLUTION: Yes

要记住的一点是,有时项目会对特性分支的命名有特定要求。例如,如果一个分支将要解决错误修复,那么许多项目会要求添加一个 bugfix- 前缀。回到我们处理登录表单错误的分支,它得被命名为 bugfix-login-form 。所以一定要阅读 CONTRIBUTING.md 文件,确定项目是否对特性分支的命名提供了特别说明。

最佳实践

编写描述性的提交说明

在谈论如何命名分支,以清晰描述分支会包含 哪些 更改的同时,我想另外提醒一下如何编写清晰、描述性的提交说明。你的分支名称和提交说明描述得越清楚,项目维护者用于询问你的代码的用途,或者自己去深入了解代码的时间就越少。项目维护者需要做的工作越少,将你的更改纳入项目的速度就越快。

创建短小而明确的 commit

这一点我们之前已经强调了很多次,请确保在对项目 commit 更改时,使用短小的 commit。不要进行大量 commit,记录 10 多个文件和数百行代码的更改。最好频繁多次地进行小的 commit,只记录很少数量的文件和代码更改。

你可以这样想:如果开发者不喜欢你的大量 commit 中的 一部分 更改,他们不可能说"我赞成 commit A,只是不赞成改变边栏背景颜色的那部分。" 一个 commit 不能分解成几个小块,所以确保你的 commit 足够小,每个只集中解决一个更改。这样,维护者可以说“我赞成 commit A、B、C、D 和 F,但不赞成 commit E。

更新 README

最后,如果你添加的任何代码更改会使项目发生极大的变化,则应更新 README 文件以向其他人说明此更改。

小结

在开始任何工作之前,确保阅读项目的 CONTRIBUTING.md 文件。

接下来,查看项目的 GitHub 问题

  • 查看现有的问题,看是否有哪些内容类似于你想贡献的更改
  • 如有必要,创建一个新的 Issue
  • 与项目维护者交流你想要做出的更改

当开始开发后,将所有工作 commit 到特性分支上:

  • 不要在主分支上工作
  • 确保给特性分支赋予一个清晰、描述性的名称

以及编写 commit 的一般最佳实践

  • 频繁少量 commit
  • 使用清晰、具有描述性的提交说明
  • 必要情况下,更新 README 文件